{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## SVM——皮马印第安人糖尿病分类"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 首先 import 必要的模块\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "\n",
    "#竞赛的评价指标为logloss\n",
    "#from sklearn.metrics import log_loss  \n",
    "#SVM并不能直接输出各类的概率，所以在这个例子中我们用正确率作为模型预测性能的度量\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn import metrics\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 读取数据 & 数据探索"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>6</td>\n",
       "      <td>148</td>\n",
       "      <td>72</td>\n",
       "      <td>35</td>\n",
       "      <td>0</td>\n",
       "      <td>33.6</td>\n",
       "      <td>0.627</td>\n",
       "      <td>50</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>85</td>\n",
       "      <td>66</td>\n",
       "      <td>29</td>\n",
       "      <td>0</td>\n",
       "      <td>26.6</td>\n",
       "      <td>0.351</td>\n",
       "      <td>31</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>8</td>\n",
       "      <td>183</td>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>23.3</td>\n",
       "      <td>0.672</td>\n",
       "      <td>32</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>89</td>\n",
       "      <td>66</td>\n",
       "      <td>23</td>\n",
       "      <td>94</td>\n",
       "      <td>28.1</td>\n",
       "      <td>0.167</td>\n",
       "      <td>21</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>137</td>\n",
       "      <td>40</td>\n",
       "      <td>35</td>\n",
       "      <td>168</td>\n",
       "      <td>43.1</td>\n",
       "      <td>2.288</td>\n",
       "      <td>33</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Pregnancies  Glucose  BloodPressure  SkinThickness  Insulin   BMI  \\\n",
       "0            6      148             72             35        0  33.6   \n",
       "1            1       85             66             29        0  26.6   \n",
       "2            8      183             64              0        0  23.3   \n",
       "3            1       89             66             23       94  28.1   \n",
       "4            0      137             40             35      168  43.1   \n",
       "\n",
       "   DiabetesPedigreeFunction  Age  Outcome  \n",
       "0                     0.627   50        1  \n",
       "1                     0.351   31        0  \n",
       "2                     0.672   32        1  \n",
       "3                     0.167   21        0  \n",
       "4                     2.288   33        1  "
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 读取数据\n",
    "# path to where the data lies\n",
    "#dpath = './data/'\n",
    "#train = pd.read_csv(dpath +\"diabetes.csv\")\n",
    "train = pd.read_csv(\"diabetes.csv\")\n",
    "train.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 768 entries, 0 to 767\n",
      "Data columns (total 9 columns):\n",
      "Pregnancies                 768 non-null int64\n",
      "Glucose                     768 non-null int64\n",
      "BloodPressure               768 non-null int64\n",
      "SkinThickness               768 non-null int64\n",
      "Insulin                     768 non-null int64\n",
      "BMI                         768 non-null float64\n",
      "DiabetesPedigreeFunction    768 non-null float64\n",
      "Age                         768 non-null int64\n",
      "Outcome                     768 non-null int64\n",
      "dtypes: float64(2), int64(7)\n",
      "memory usage: 54.1 KB\n"
     ]
    }
   ],
   "source": [
    "train.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Pregnancies</th>\n",
       "      <th>Glucose</th>\n",
       "      <th>BloodPressure</th>\n",
       "      <th>SkinThickness</th>\n",
       "      <th>Insulin</th>\n",
       "      <th>BMI</th>\n",
       "      <th>DiabetesPedigreeFunction</th>\n",
       "      <th>Age</th>\n",
       "      <th>Outcome</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>count</th>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "      <td>768.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>mean</th>\n",
       "      <td>3.845052</td>\n",
       "      <td>120.894531</td>\n",
       "      <td>69.105469</td>\n",
       "      <td>20.536458</td>\n",
       "      <td>79.799479</td>\n",
       "      <td>31.992578</td>\n",
       "      <td>0.471876</td>\n",
       "      <td>33.240885</td>\n",
       "      <td>0.348958</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>std</th>\n",
       "      <td>3.369578</td>\n",
       "      <td>31.972618</td>\n",
       "      <td>19.355807</td>\n",
       "      <td>15.952218</td>\n",
       "      <td>115.244002</td>\n",
       "      <td>7.884160</td>\n",
       "      <td>0.331329</td>\n",
       "      <td>11.760232</td>\n",
       "      <td>0.476951</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>min</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.078000</td>\n",
       "      <td>21.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>25%</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>62.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>0.000000</td>\n",
       "      <td>27.300000</td>\n",
       "      <td>0.243750</td>\n",
       "      <td>24.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50%</th>\n",
       "      <td>3.000000</td>\n",
       "      <td>117.000000</td>\n",
       "      <td>72.000000</td>\n",
       "      <td>23.000000</td>\n",
       "      <td>30.500000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>0.372500</td>\n",
       "      <td>29.000000</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>75%</th>\n",
       "      <td>6.000000</td>\n",
       "      <td>140.250000</td>\n",
       "      <td>80.000000</td>\n",
       "      <td>32.000000</td>\n",
       "      <td>127.250000</td>\n",
       "      <td>36.600000</td>\n",
       "      <td>0.626250</td>\n",
       "      <td>41.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>max</th>\n",
       "      <td>17.000000</td>\n",
       "      <td>199.000000</td>\n",
       "      <td>122.000000</td>\n",
       "      <td>99.000000</td>\n",
       "      <td>846.000000</td>\n",
       "      <td>67.100000</td>\n",
       "      <td>2.420000</td>\n",
       "      <td>81.000000</td>\n",
       "      <td>1.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       Pregnancies     Glucose  BloodPressure  SkinThickness     Insulin  \\\n",
       "count   768.000000  768.000000     768.000000     768.000000  768.000000   \n",
       "mean      3.845052  120.894531      69.105469      20.536458   79.799479   \n",
       "std       3.369578   31.972618      19.355807      15.952218  115.244002   \n",
       "min       0.000000    0.000000       0.000000       0.000000    0.000000   \n",
       "25%       1.000000   99.000000      62.000000       0.000000    0.000000   \n",
       "50%       3.000000  117.000000      72.000000      23.000000   30.500000   \n",
       "75%       6.000000  140.250000      80.000000      32.000000  127.250000   \n",
       "max      17.000000  199.000000     122.000000      99.000000  846.000000   \n",
       "\n",
       "              BMI  DiabetesPedigreeFunction         Age     Outcome  \n",
       "count  768.000000                768.000000  768.000000  768.000000  \n",
       "mean    31.992578                  0.471876   33.240885    0.348958  \n",
       "std      7.884160                  0.331329   11.760232    0.476951  \n",
       "min      0.000000                  0.078000   21.000000    0.000000  \n",
       "25%     27.300000                  0.243750   24.000000    0.000000  \n",
       "50%     32.000000                  0.372500   29.000000    0.000000  \n",
       "75%     36.600000                  0.626250   41.000000    1.000000  \n",
       "max     67.100000                  2.420000   81.000000    1.000000  "
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "## 各属性的统计特性\n",
    "train.describe()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Target 分布，看看各类样本分布是否均衡\n",
    "sns.countplot(train.Outcome);\n",
    "pyplot.xlabel('target');\n",
    "pyplot.ylabel('Number of occurrences');"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 从原始数据中分离输入特征x和输出y\n",
    "y = train['Outcome'].values\n",
    "X = train.drop('Outcome', axis = 1)\n",
    "\n",
    "#用于后续显示权重系数对应的特征\n",
    "columns = X.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(614, 8)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#将数据分割训练数据与测试数据\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "# 随机采样20%的数据构建测试样本，其余作为训练样本\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=22, test_size=0.2)\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 数据标准化\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "# 初始化特征的标准化器\n",
    "ss_X = StandardScaler()\n",
    "\n",
    "# 分别对训练和测试数据的特征进行标准化处理\n",
    "X_train = ss_X.fit_transform(X_train)\n",
    "X_test = ss_X.transform(X_test)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 模型训练"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### default SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#LinearSVC不能得到每类的概率，在Otto数据集要求输出每类的概率，这里只是示意SVM的使用方法\n",
    "#https://xacecask2.gitbooks.io/scikit-learn-user-guide-chinese-version/content/sec1.4.html\n",
    "#1.4.1.2. 得分与概率\n",
    "from sklearn.svm import LinearSVC\n",
    "\n",
    "SVC1 = LinearSVC().fit(X_train_part, y_train_part)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Classification report for classifier LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True,\n",
      "     intercept_scaling=1, loss='squared_hinge', max_iter=1000,\n",
      "     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,\n",
      "     verbose=0):\n",
      "             precision    recall  f1-score   support\n",
      "\n",
      "          0       0.82      0.90      0.86        80\n",
      "          1       0.77      0.63      0.69        43\n",
      "\n",
      "avg / total       0.80      0.80      0.80       123\n",
      "\n",
      "\n",
      "Confusion matrix:\n",
      "[[72  8]\n",
      " [16 27]]\n"
     ]
    }
   ],
   "source": [
    "#在校验集上测试，估计模型性能\n",
    "y_predict = SVC1.predict(X_val)\n",
    "\n",
    "print(\"Classification report for classifier %s:\\n%s\\n\"\n",
    "      % (SVC1, metrics.classification_report(y_val, y_predict)))\n",
    "print(\"Confusion matrix:\\n%s\" % metrics.confusion_matrix(y_val, y_predict))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 线性SVM正则参数调优\n",
    "线性SVM LinearSVC的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和正则函数penalty（L2/L1）\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_Linear(C, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC2 =  LinearSVC( C = C)\n",
    "    SVC2 = SVC2.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC2.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.7886178861788617\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.6829268292682927\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "No handles with labels found to put in legend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6747967479674797\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-3, 3, 7)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份  \n",
    "#penalty_s = ['l1','l2']\n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "#    for j, penalty in enumerate(penalty_s):\n",
    "    tmp = fit_grid_point_Linear(oneC, X_train, y_train, X_val, y_val)\n",
    "    accuracy_s.append(tmp)\n",
    "\n",
    "x_axis = np.log10(C_s)\n",
    "#for j, penalty in enumerate(penalty_s):\n",
    "pyplot.plot(x_axis, np.array(accuracy_s), 'b-')\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()\n",
    "  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### RBF核SVM正则参数调优\n",
    "RBF核是SVM最常用的核函数。 RBF核SVM 的需要调整正则超参数包括C（正则系数，一般在log域（取log后的值）均匀设置候选参数）和核函数的宽度gamma C越小，决策边界越平滑； gamma越小，决策边界越平滑。\n",
    "\n",
    "采用交叉验证，网格搜索步骤与Logistic回归正则参数处理类似，在此略。\n",
    "\n",
    "这里我们用校验集（X_val、y_val）来估计模型性能"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.svm import SVC"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def fit_grid_point_RBF(C, gamma, X_train, y_train, X_val, y_val):\n",
    "    \n",
    "    # 在训练集是那个利用SVC训练\n",
    "    SVC3 =  SVC( C = C, kernel='rbf', gamma = gamma)\n",
    "    SVC3 = SVC3.fit(X_train, y_train)\n",
    "    \n",
    "    # 在校验集上返回accuracy\n",
    "    accuracy = SVC3.score(X_val, y_val)\n",
    "    \n",
    "    print(\"accuracy: {}\".format(accuracy))\n",
    "    return accuracy"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8292682926829268\n",
      "accuracy: 0.975609756097561\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.8699186991869918\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.9512195121951219\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-2, 2, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-2, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.7154471544715447\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6504065040650406\n",
      "accuracy: 0.6585365853658537\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8861788617886179\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8048780487804879\n",
      "accuracy: 0.8211382113821138\n",
      "accuracy: 0.959349593495935\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.7967479674796748\n",
      "accuracy: 0.8211382113821138\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 0.8130081300813008\n",
      "accuracy: 0.8780487804878049\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n",
      "accuracy: 1.0\n"
     ]
    }
   ],
   "source": [
    "#需要调优的参数\n",
    "C_s = np.logspace(-1, 3, 5)# logspace(a,b,N)把10的a次方到10的b次方区间分成N份 \n",
    "gamma_s = np.logspace(-3, 2, 5)  \n",
    "\n",
    "accuracy_s = []\n",
    "for i, oneC in enumerate(C_s):\n",
    "    for j, gamma in enumerate(gamma_s):\n",
    "        tmp = fit_grid_point_RBF(oneC, gamma, X_train, y_train, X_val, y_val)\n",
    "        accuracy_s.append(tmp)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\ngg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "accuracy_s1 =np.array(accuracy_s).reshape(len(C_s),len(gamma_s))\n",
    "x_axis = np.log10(C_s)\n",
    "for j, gamma in enumerate(gamma_s):\n",
    "    pyplot.plot(x_axis, np.array(accuracy_s1[:,j]), label = ' Test - log(gamma)' + str(np.log10(gamma)))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'log(C)' )                                                                                                      \n",
    "pyplot.ylabel( 'accuracy' )\n",
    "pyplot.savefig('RBF_SVM_Otto.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
